package Controllers;

import Configs.Config;
import GUIs.f_nhanvien_chunhatro_phongtro_sua;
import GUIs.f_nhanvien_chunhatro_phongtro_them;
import com.db4o.ObjectSet;
import com.db4o.ext.DatabaseClosedException;
import com.db4o.ext.DatabaseReadOnlyException;
import com.db4o.ext.Db4oIOException;
import com.db4o.query.Predicate;
import com.db4o.query.Query;
import java.text.ParseException;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import models.DiaChi;
import models.LoaiPhong;
import models.NhaTro;
import models.PhongTro;

public class PhongTroController {

    private final Config conn;
    private BieuThucChinhQuy btcq;
    private MyTableFormat myFormat;

    public PhongTroController(Config conn) {
        this.conn = conn;
    }
    
    public PhongTro getNhaTroWithMaPhong(String maPhongTro) {
        return this.conn.getConn().query(new Predicate<PhongTro>() {
            @Override
            public boolean match(PhongTro phongTro) {
                return (phongTro.getMaphong().equals(maPhongTro));
            }
        }).next();
    }

    public String generateMaPhongTro() {
        Query query = this.conn.getConn().query();
        query.constrain(PhongTro.class);
        query.sortBy((PhongTro phongTroA, PhongTro phongTroB) -> XuLyChuoi.getNumMaPhong(phongTroB.getMaphong()) - XuLyChuoi.getNumMaPhong(phongTroA.getMaphong()));
        try {
            PhongTro phongTro = (PhongTro) query.execute().next();
            int maxPhongTro = XuLyChuoi.getNumMaPhong(phongTro.getMaphong()) + 1;
            return XuLyChuoi.joinMaPhongTro(maxPhongTro);
        } catch (Exception ex) {
            return "PT0001";
        }
    }

    public void ShowFreePhongTro(JTable tbPhongTro, String txtSoNguoi) throws ParseException {
        DefaultTableModel model = (DefaultTableModel) tbPhongTro.getModel();
        this.myFormat = new MyTableFormat();
        try{
        final int soNguoiO = Integer.parseInt(txtSoNguoi);
       ObjectSet<PhongTro> phongTros = this.conn.getConn().query(new Predicate<PhongTro>() {
            @Override
            public boolean match(PhongTro et) {
                return et.getLoaiphong().getSucchua() == soNguoiO && !et.getIsDel()&& et.getTinhtrang();
            }
        });
        GiaPhongController giaPhongControl = new GiaPhongController(this.conn);
        for (PhongTro phongTro : phongTros) {
            DiaChi dc = phongTro.getNhatro().getDiachi();
            Object[] row = {phongTro.getMaphong(),phongTro.getNhatro().getMotanhatro(),"<html>- Số nhà: " + dc.getSonha() + "<br/>- Hẻm: " + dc.getHem() + "<br/>- Đường: " + dc.getDuong() + "<br/>- Quận (huyện):" + dc.getQuanhuyen() + "<br/>- Tỉnh (thành phố): " + dc.getTinhtp() + "</html>",XuLyCurrency.priceWithDecimal(giaPhongControl.giaPhong(phongTro.getLoaiphong().getDschitietgia()))};
            model.addRow(row);
        }
       this.myFormat.resizeFitRows(tbPhongTro);
        }
        catch(NumberFormatException | Db4oIOException | DatabaseClosedException ex)
        {
            JOptionPane.showMessageDialog(null, "Vui lòng chọn số người ở","Thông báo",JOptionPane.ERROR_MESSAGE);
        }
    }

    public void Show(JTable tbdsPhongTro, String sogpkd) throws ParseException {
        this.myFormat = new MyTableFormat();
        DefaultTableModel model = (DefaultTableModel) tbdsPhongTro.getModel();
        ObjectSet<PhongTro> phongTros = this.conn.getConn().query(new Predicate<PhongTro>() {
            @Override
            public boolean match(PhongTro et) {
                return et.getNhatro().getGPKD().equals(sogpkd) && !et.getIsDel();
            }
        });
        int stt = 0;
        GiaPhongController giaPhongControl = new GiaPhongController(this.conn);
        for (PhongTro phongTro : phongTros) {
            Object[] row = {++stt, phongTro.getMaphong(), XuLyCurrency.priceWithDecimal(giaPhongControl.giaPhong(phongTro.getLoaiphong().getDschitietgia())), (phongTro.getTinhtrang()) ? "Còn trống" : "Đang được thuê"};
            model.addRow(row);
        }
        this.myFormat.resizeFitRows(tbdsPhongTro);
    }

    public boolean Add(f_nhanvien_chunhatro_phongtro_them them_phongtro) throws ParseException {
        try {
            String maPhong = them_phongtro.tfmaphong.getText();
            String loaiPhong = them_phongtro.cbbloaiphong.getSelectedItem().toString();
            if (loaiPhong.equals("- Chọn loại phòng -")) {
                JOptionPane.showMessageDialog(them_phongtro, "Vui lòng chọn loại phòng.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                them_phongtro.cbbloaiphong.requestFocus();
            } else {
                LoaiPhong loaiPhongRef = this.conn.getConn().query(new Predicate<LoaiPhong>() {
                    @Override
                    public boolean match(LoaiPhong et) {
                        return et.getMotaloai().equals(loaiPhong);
                    }
                }).next();
                NhaTro nhaTroRef = them_phongtro.nhaTroThem;
                PhongTro phongTroThem = new PhongTro(maPhong, true);
                phongTroThem.setNhatro(nhaTroRef);
                phongTroThem.setLoaiphong(loaiPhongRef);
                nhaTroRef.addPhongTro(phongTroThem);
                this.conn.getConn().store(phongTroThem);

                DefaultTableModel model = (DefaultTableModel) them_phongtro.tbdsphongtro.getModel();
                int stt = them_phongtro.tbdsphongtro.getRowCount() + 1;
                GiaPhongController giaPhongControl = new GiaPhongController(this.conn);
                Object[] row = {stt, phongTroThem.getMaphong(), phongTroThem.getLoaiphong().getMotaloai(), XuLyCurrency.priceWithDecimal(giaPhongControl.giaPhong(phongTroThem.getLoaiphong().getDschitietgia())), (phongTroThem.getTinhtrang()) ? "Còn trống" : "Đang được thuê"};
                model.addRow(row);
                // this.myFormat.resizeFitRows(them_phongtro.tbdsphongtro);
                return true;
            }
        } catch (Db4oIOException | DatabaseClosedException | DatabaseReadOnlyException ex) {
            System.out.println(ex.toString());
        }
        return false;
    }

    public boolean Edit(f_nhanvien_chunhatro_phongtro_them them_phongtro) {
        try {
            final String maPhong = them_phongtro.tfmaphong.getText();
            String loaiPhong = them_phongtro.cbbloaiphong.getSelectedItem().toString();
            if (loaiPhong.equals("- Chọn loại phòng -")) {
                JOptionPane.showMessageDialog(them_phongtro, "Vui lòng chọn loại phòng.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                them_phongtro.cbbloaiphong.requestFocus();
            } else {
                LoaiPhong loaiPhongRef = this.conn.getConn().query(new Predicate<LoaiPhong>() {
                    @Override
                    public boolean match(LoaiPhong et) {
                        return et.getMotaloai().equals(loaiPhong);
                    }
                }).next();
                PhongTro phongTroSua = this.conn.getConn().query(new Predicate<PhongTro>() {
                    @Override
                    public boolean match(PhongTro et) {
                        return et.getMaphong().equals(maPhong);
                    }
                }).next();
                phongTroSua.setLoaiphong(loaiPhongRef);
                this.conn.getConn().store(phongTroSua);
                return true;
            }
        } catch (Db4oIOException | DatabaseClosedException | DatabaseReadOnlyException ex) {
            System.out.println(ex.toString());
        }
        return false;
    }
    
    public boolean EditBasic(f_nhanvien_chunhatro_phongtro_sua sua_phongtro)
    {
            String maPhong = sua_phongtro.tfmaphong.getText();
            String loaiPhong = sua_phongtro.cbxloaiphong.getSelectedItem().toString();
            if (loaiPhong.equals("- Chọn loại phòng -")) {
                JOptionPane.showMessageDialog(sua_phongtro, "Vui lòng chọn loại phòng.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                sua_phongtro.cbxloaiphong.requestFocus();
            } else {
                LoaiPhong loaiPhongRef = this.conn.getConn().query(new Predicate<LoaiPhong>() {
                    @Override
                    public boolean match(LoaiPhong et) {
                        return et.getMotaloai().equals(loaiPhong);
                    }
                }).next();
                PhongTro phongTroSua = this.conn.getConn().query(new Predicate<PhongTro>() {
                    @Override
                    public boolean match(PhongTro et) {
                        return et.getMaphong().equals(maPhong);
                    }
                }).next();
                phongTroSua.setLoaiphong(loaiPhongRef);
                this.conn.getConn().store(phongTroSua);
                return true;
            }
        return false;
    }
         
    public boolean Delete(String maPhongTro) {
        ObjectSet<PhongTro> xoa = this.conn.getConn().query(new Predicate<PhongTro>() {
            @Override
            public boolean match(PhongTro et) {
                return et.getMaphong().equals(maPhongTro);
            }
        });
        while (xoa.hasNext()) {
            PhongTro phongTro = xoa.next();
            if (phongTro.getDshopdong().isEmpty()) {
                phongTro.getNhatro().removeDsPhongTro(phongTro);
                this.conn.getConn().delete(phongTro);
            } else {
                phongTro.setIsDel(true);
                this.conn.getConn().store(phongTro);
            }
        }
        return true;
    }
}
